package com.simpou.commons.utils.lang;


import java.util.*;

/**
 * Implementação de um hashset que diferencia os items segundo suas referências em
 * memória, ou seja, dois items são consideradas iguais se apontam para um
 * mesmo endereço em memória. O hashcode é considerado como único.
 *
 * @author Jonas Pereira
 * @since 2013-11-24
 */
public class RefHashSet<T> extends HashSet<RefEntry<T>> {

    @Override
    public boolean contains(Object item) {
        return super.contains(new RefEntry<T>(item));
    }

    public boolean addNew(final T item) {
        return super.add(new RefEntry<T>(item));
    }

    @Override
    public boolean remove(Object item) {
        return super.remove(new RefEntry<T>(item));
    }

    public Set<T> toSet() {
        final Set<T> set = new HashSet<T>();
        fillCollection(set);
        return set;
    }

    private void fillCollection(Collection<T> collection) {
        for (RefEntry<T> item : this) {
            collection.add(item.getValue());
        }
    }

    public List<T> toList() {
        final List<T> list = new ArrayList<T>();
        fillCollection(list);
        return list;
    }
}
